// 经纬度计算方法

export function Rad(d) {
  // 经纬度转换成三角函数中度分表形式
  return d * Math.PI / 180.0
}

/**
 * 两经纬度之间的水平距离
 *
 * @param lat1
 * @param lng1
 * @param lat2
 * @param lng2
 * @return
 */
export function calHorizontalDistance(lat1, lng1, lat2, lng2) {
  var radLat1 = Rad(parseFloat(lat1))
  var radLat2 = Rad(parseFloat(lat2))
  var a = radLat1 - radLat2
  var b = Rad(parseFloat(lng1)) - Rad(parseFloat(lng2))
  var s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) + Math.cos(radLat1) * Math.cos(radLat2) * Math.pow(Math.sin(b / 2), 2)))
  // 地球半径
  s = s * 6378.137
  // 输出为米
  s = Math.round(s * 10000) / 10
  return s
}

/**
 * 两经纬度之间的斜距
 *
 * @param lat1
 * @param lng1
 * @param lat2
 * @param lng2
 * @param height 两经纬点的高度差
 * @return
 */
export function calObliqueDistance(lat1, lng1, lat2, lng2, height) {
  let horizontalDistance = calHorizontalDistance(lat1, lng1, lat2, lng2)
  let s = Math.sqrt(horizontalDistance * horizontalDistance + height * height)
  return s
}

/**
 * 两经纬度之间的俯仰角
 *
 * @param lat1
 * @param lng1
 * @param lat2
 * @param lng2
 * @param height 两经纬点的高度差
 * @return
 */
export function calObliqueAngle(lat1, lng1, lat2, lng2, height) {
  let horizontalDistance = calHorizontalDistance(lat1, lng1, lat2, lng2)
  let s = Math.atan(height / horizontalDistance)
  return s
}

/**
 * 两经纬度之间的斜角 ：相同纬度，不同经度
 *
 * @param lat1
 * @param lng1
 * @param lat2
 * @param lng2
 * @param height 两经纬点的高度差
 * @return
 */
export function calBevelAngle(lat1, lng1, lat2, lng2) {
  // 水平直距离 X
  let horizontalLevelDistance = calHorizontalDistance(lat1, lng1, lat1, lng2)
  // 水平斜距 X*X + Y*Y
  let horizontalDevelDistance = calHorizontalDistance(lat1, lng1, lat2, lng2)
  // 对边长度 Y
  let ySide = Math.sqrt(horizontalDevelDistance * horizontalDevelDistance - horizontalLevelDistance * horizontalLevelDistance)

  let s = Math.atan(ySide / horizontalLevelDistance)

  return s
}
